//
//  HJChatMessageModel.m
//  KaiChat
//
//  Created by lx on 2023/10/21.
//

#import "HJChatMessageModel.h"

@implementation HJChatMessageModel


MJLogAllIvars

+ (NSArray *)bg_uniqueKeys {
    return @[@"msgId"];
}

+ (NSArray *)bg_ignoreKeys {
    return @[@"thumbnailImage", @"progress", @"thumbs", @"asset", @"originalImage", @"fileURL", @"isForword", @"lastMessageTime"];
}

+(NSArray *)mj_ignoredPropertyNames {
    return [self bg_ignoreKeys];
}

- (NSString *)bg_tableName {
    return [NSString stringWithFormat:@"%@_%@", NSStringFromClass(self.class), [NSString stringWithFormat:@"%@%@", HJUserInfo.userId, _sessionId].md5];
}

+ (NSString *)bg_tableNameWithSessionId:(NSString *)sessionId {
    return [NSString stringWithFormat:@"%@_%@", NSStringFromClass(self.class), [NSString stringWithFormat:@"%@%@", HJUserInfo.userId, sessionId].md5];
}

//根据收到的消息构造消息模型, 收到消息拿用户Id去查询用户信息

+ (HJChatMessageModel *)textMessageModelWithDict:(NSDictionary *)dict {
    HJChatMessageModel *messageModel = [HJChatMessageModel chatMessageModelWithDict:dict];
    NSDictionary *msgDict = dict[@"msg"];
    if ([msgDict isKindOfClass:NSDictionary.class]) {
        messageModel.content = msgDict[@"content"];
        messageModel.msg = [dict[@"msg"] mj_JSONString];
    }
    return messageModel;
}

+ (HJChatMessageModel *)imageMessageModelWithDict:(NSDictionary *)dict {
    HJChatMessageModel *messageModel = [HJChatMessageModel chatMessageModelWithDict:dict];
    NSDictionary *picture = dict[@"picture"];
    if ([picture isKindOfClass:NSDictionary.class]) {
        messageModel.msg = @"";
        messageModel.fileUrl = picture[@"origin_picture"];
        messageModel.thumbnailUrl = picture[@"url"];
    }
    return messageModel;
}

+ (HJChatMessageModel *)voiceMessageModelWithDict:(NSDictionary *)dict {
    HJChatMessageModel *messageModel = [HJChatMessageModel chatMessageModelWithDict:dict];
    NSDictionary *voice = dict[@"voice"];
    if ([voice isKindOfClass:NSDictionary.class]) {
        messageModel.msg = @{
            @"duration": voice[@"duration"],
        }.mj_JSONString;
        messageModel.fileUrl = voice[@"url"];
        
        if (isEmptyString(messageModel.fileUrl)) {
            NSDictionary *msgDict = dict[@"msg"];
            if ([msgDict isKindOfClass:NSDictionary.class]) {
                messageModel.fileUrl = msgDict[@"content"];
            }
        }
    }
    return messageModel;
}

+ (HJChatMessageModel *)videoMessageModelWithDict:(NSDictionary *)dict {
    
    HJChatMessageModel *messageModel = [HJChatMessageModel chatMessageModelWithDict:dict];
    
    return messageModel;
}

//聊天的消息
+ (HJChatMessageModel *)chatMessageModelWithDict:(NSDictionary *)dict {
    HJChatMessageModel *messageModel = [HJChatMessageModel baseMessageModelWithDict:dict];
    messageModel.countedUnreadCount = YES;

    if (messageModel.chatType == HJChatTypeSingle || messageModel.chatType == HJChatTypeGroup) {
        messageModel.senderId = toString(dict[@"send_uid"]);
        messageModel.sessionId = toString(dict[@"session_id"]);
        
        if (messageModel.chatType == HJChatTypeSingle) {
            messageModel.receiverId = toString(dict[@"rcv_uid"]);
        } else {
            messageModel.groupId = toString(dict[@"session_id"]);
            messageModel.senderNickname = dict[@"sender_name"];
            messageModel.senderAvatar = dict[@"sender_pic"];
        }
    }
    return messageModel;
}

+ (HJChatMessageModel *)baseMessageModelWithDict:(NSDictionary *)dict {

    HJChatMessageModel *messageModel = [[HJChatMessageModel alloc] init];
    messageModel.serverMsgId = toString(dict[@"seq_id"]);
    messageModel.msgId = messageModel.serverMsgId;
    messageModel.msgStatus = HJMessageStatusSucceed;
    messageModel.chatType = [dict[@"op"] intValue];
    messageModel.timestamp = toString(dict[@"send_time_srv"]);
    NSInteger type = [dict[@"typ"] intValue];
    messageModel.messageType = type == 50 ? HJMessageTypeSystem : type;
    return messageModel;
}

- (nullable NSString *)getSingleChatTipMessageWithDict:(NSDictionary *)msgDict {
    if (_systemMsgType == 2) {//申请好友通过
        return msgDict[@"content"];
    }
    return msgDict[@"content"];
}

- (nullable NSString *)getGroupChatTipMessageWithDict:(NSDictionary *)systemMsgDict {
    
    if (_systemMsgType == 400) {//解散群
        
        
    } else if (_systemMsgType == 401) {//转让群
        
        
    } else if (_systemMsgType == 402) {//新建群
        NSArray *be_executed = systemMsgDict[@"be_executed"];
        NSMutableArray *names = [NSMutableArray arrayWithCapacity:be_executed.count];
        for (NSDictionary *dict in be_executed) {
            [names addObject:dict[@"name"]];
        }
        return [NSString stringWithFormat:@"You invited %@ to join the group", [names componentsJoinedByString:@","]];
    } else if (_systemMsgType == 403) {//邀请入群
        NSArray *be_executed = systemMsgDict[@"be_executed"];
        NSMutableArray *names = [NSMutableArray arrayWithCapacity:be_executed.count];
        for (NSDictionary *dict in be_executed) {
            [names addObject:dict[@"name"]];
        }
        return [NSString stringWithFormat:@"You invited %@ to join the group", [names componentsJoinedByString:@","]];
    } else if (_systemMsgType == 404) {//修改了群名字
        
        
    } else if (_systemMsgType == 405) {//添加群管理员
        
        
    } else if (_systemMsgType == 406) {//删除群管理员
        
        
    } else if (_systemMsgType == 407) {//被踢退群
        
        
    } else if (_systemMsgType == 408) {//退群
        
        
    } else if (_systemMsgType == 409) {//发布群公告
        
        
    } else if (_systemMsgType == 410) {//审核通知
        
        
    }
    return nil;
}

+ (HJChatMessageModel *)tipMessageModelWithDict:(NSDictionary *)dict {
    HJChatMessageModel *messageModel = [HJChatMessageModel chatMessageModelWithDict:dict];
    messageModel.countedUnreadCount = NO;
    messageModel.systemMsgType = [dict[@"system_msg_typ"] intValue];
    NSDictionary *systemMsgDict = dict[@"room_sys_msg"];

    if (messageModel.chatType == HJChatTypeSingle) {
        messageModel.content = [messageModel getSingleChatTipMessageWithDict:dict[@"msg"]];
    } else if (messageModel.chatType == HJChatTypeGroup) {
        messageModel.content = [messageModel getGroupChatTipMessageWithDict:systemMsgDict];
    }
    if (isEmptyString(messageModel.content)) return nil;
    return messageModel;
}

+ (nullable HJChatMessageModel *)messageModelWithDict:(NSDictionary *)dict {
    
    HJMessageType messageType = [dict[@"typ"] intValue];
    if (messageType == HJMessageTypeText) {
        return [HJChatMessageModel textMessageModelWithDict:dict];
    }
    
    if (messageType == HJMessageTypeImage) {
        return [HJChatMessageModel imageMessageModelWithDict:dict];
    }
    
    if (messageType == HJMessageTypeVoice) {
        return [HJChatMessageModel voiceMessageModelWithDict:dict];
    }
    
    if (messageType == HJMessageTypeVideo) {
        return [HJChatMessageModel videoMessageModelWithDict:dict];
    }
    
    if (messageType == HJMessageTypeSystem  || messageType == HJMessageTypeOtherSystem) {
        return [HJChatMessageModel tipMessageModelWithDict:dict];
    }
    
    NSLog(@"HJChatTypeSystem = %@", dict);
    return nil;
}

+ (nullable HJChatMessageModel *)messageModelWithOfflineDict:(NSDictionary *)dict {

    NSInteger systemMsgType = [dict[@"sys_msg_type"] intValue];
    NSInteger type = [dict[@"type"] intValue];
    NSInteger chat_type = [dict[@"chat_type"] intValue];
    HJMessageType messageType = type == 50 ? HJMessageTypeSystem : type;
    BOOL showTips = chat_type == 1 || chat_type == 2;
    if (messageType == HJMessageTypeSystem && !showTips) {//不需要显示的直接过滤
        return nil;
    }
        
    HJChatMessageModel *messageModel = [[HJChatMessageModel alloc] init];
    messageModel.serverMsgId = toString(dict[@"seq_id"]);
    messageModel.sessionId = toString(dict[@"session_id"]);
    messageModel.senderId = toString(dict[@"user_id"]);
    messageModel.msgId = messageModel.serverMsgId;
    messageModel.msgStatus = HJMessageStatusSucceed;
    messageModel.messageType = messageType;
    messageModel.timestamp = toString(dict[@"created_at"]);
    messageModel.systemMsgType = systemMsgType;
    messageModel.countedUnreadCount = ![messageModel isTipMessage];
 
    if (chat_type == 1) {
        messageModel.chatType = HJChatTypeSingle;
        messageModel.receiverId = toString(dict[@"other_user_id"]);
    } else if (chat_type == 2) {
        messageModel.chatType = HJChatTypeGroup;
        messageModel.groupId = toString(dict[@"session_id"]);
        messageModel.senderNickname = dict[@"sender_name"];
        messageModel.senderAvatar = dict[@"sender_pic"];
    }
    
    if (messageModel.messageType == HJMessageTypeText) {
        messageModel.content = dict[@"content"];
        if (dict[@"content"]) {
            messageModel.msg = [@{
                @"content": dict[@"content"]
            } mj_JSONString];
        }
        return messageModel;
    }
    
    if (messageModel.messageType == HJMessageTypeImage) {
        messageModel.thumbnailUrl = dict[@"content"];
        messageModel.fileUrl = dict[@"original_picture"];
        return messageModel;
    }
    
    if (messageModel.messageType == HJMessageTypeVoice) {
        messageModel.msg = @{
            @"duration": dict[@"duration"],
        }.mj_JSONString;
        messageModel.fileUrl = dict[@"content"];
        return messageModel;
    }
    
    if (messageModel.messageType == HJMessageTypeSystem) {//拼成在线消息
        if (messageModel.chatType == HJChatTypeSingle) {
            NSMutableDictionary *dict = [NSMutableDictionary dictionary];
            [dict setValue:dict[@"content"] forKey:@"content"];
            messageModel.content = [messageModel getSingleChatTipMessageWithDict:dict];
        } else {
            messageModel.content = [messageModel getGroupChatTipMessageWithDict:[dict[@"content"] mj_JSONObject]];
        }
        if (isEmptyString(messageModel.content)) return nil;
    }
    return messageModel;
}

- (void)downloadVoice {
    if (self.messageType == HJMessageTypeVoice) {
        self.localPath = self.fileUrl.lastPathComponent.tj_IMFileCachePath;
        if (![[NSFileManager defaultManager] fileExistsAtPath:self.localPath.lastPathComponent.tj_IMFileCachePath]) {
            HJDownloadFileWithUrl(self.fileUrl, ^(CGFloat value) {
            }, ^NSURL * _Nonnull{
                NSLog(@"下载语音完成");
                return [NSURL fileURLWithPath:self.localPath];
            }, ^(NSError * _Nullable error) {
            });
        }
    }
}

- (NSString *)getMessgetContent {
    if (_messageType == HJMessageTypeText) return self.content;
    if (_messageType == HJMessageTypeImage) return @"[Image]";
    if (_messageType == HJMessageTypeVideo) return @"[Video]";
    if (_messageType == HJMessageTypeVoice) return @"[Voice]";
    if (_messageType == HJMessageTypeOther) return @"[File]";
    return @"";
    
}

- (BOOL)isTipMessage {
    return _messageType == HJMessageTypeSystem || _messageType == HJMessageTypeOtherSystem;
}
 
@end

